package org.Yiran.timetale_re.util.cooldown;

import com.mojang.blaze3d.platform.Window;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.client.gui.overlay.ForgeGui;
import net.minecraftforge.client.gui.overlay.IGuiOverlay;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import org.Yiran.timetale_re.item.rune.base.RuneItem;
import org.Yiran.timetale_re.item.rune.base.RuneRegistry;

/**
 * 冷却GUI覆盖层
 * <p>
 * 负责在游戏界面中渲染物品冷却效果，特别是在热键栏中显示符文物品的冷却状态。
 * 使用半透明覆盖层来表示剩余冷却时间，类似于原版的物品使用冷却效果。
 * </p>
 * 
 * @author Yiran
 * @version 1.0
 */
@OnlyIn(Dist.CLIENT)
public class CooldownGuiOverlay implements IGuiOverlay {
    
    /**
     * 渲染GUI覆盖层
     * <p>
     * 主渲染方法，在每一帧中被调用以渲染冷却效果覆盖层。
     * 只在非调试模式下渲染热键栏物品的冷却效果。
     * </p>
     * 
     * @param gui Forge GUI实例
     * @param guiGraphics GUI图形渲染器
     * @param partialTick 部分刻时间（用于平滑动画）
     * @param screenWidth 屏幕宽度
     * @param screenHeight 屏幕高度
     */
    @Override
    public void render(ForgeGui gui, GuiGraphics guiGraphics, float partialTick, int screenWidth, int screenHeight) {
        Minecraft mc = Minecraft.getInstance();
        if (mc.player == null || mc.options.renderDebug) return;

        // 只渲染热键栏物品的冷却效果
        renderHotbarCooldowns(guiGraphics, mc);
    }

    // ==================== 热键栏冷却渲染方法 ====================

    /**
     * 渲染热键栏冷却效果
     * <p>
     * 遍历玩家热键栏中的所有物品，检查并渲染符文物品的冷却效果。
     * 冷却效果以半透明覆盖层的形式显示在物品图标上。
     * </p>
     * 
     * @param guiGraphics GUI图形渲染器
     * @param mc Minecraft客户端实例
     */
    private void renderHotbarCooldowns(GuiGraphics guiGraphics, Minecraft mc) {
        if (mc.player == null) return;

        Window window = mc.getWindow();
        int screenWidth = window.getGuiScaledWidth();
        int screenHeight = window.getGuiScaledHeight();

        // 热键栏位置（默认在屏幕底部中央）
        int hotbarX = screenWidth / 2 - 91;
        int hotbarY = screenHeight - 22;

        // 渲染每个热键栏槽位的冷却效果
        for (int i = 0; i < 9; i++) {
            ItemStack stack = mc.player.getInventory().getItem(i);
            if (!stack.isEmpty()) {

                // 检查rune类别冷却（符文物品）
                String runeItemKey = ClientCooldownManager.getCooldownKey("rune", stack.getItem(), stack);
                boolean isRuneOnCooldown = ClientCooldownManager.isOnCooldown(runeItemKey);

                if (isRuneOnCooldown) {
                    int x = hotbarX + i * 20 + 3;
                    int y = hotbarY + 3;

                    renderRuneCooldownOverlay(guiGraphics, stack, x, y);
                }
            }
        }
    }

    /**
     * 渲染符文冷却覆盖层
     * <p>
     * 根据符文物品的剩余冷却时间和最大冷却时间计算冷却进度，
     * 并渲染相应的半透明覆盖层。
     * </p>
     * 
     * @param guiGraphics GUI图形渲染器
     * @param stack 符文物品堆
     * @param x 渲染位置X坐标
     * @param y 渲染位置Y坐标
     */
    private void renderRuneCooldownOverlay(GuiGraphics guiGraphics, ItemStack stack, int x, int y) {
        long remainingTime = ClientCooldownManager.getRemainingCooldown("rune", stack.getItem(), stack);
        if (remainingTime > 0) {
            // 计算冷却进度 (0.0 - 1.0)
            float maxCooldownTicks = getRuneMaxCooldown(stack); // 根据具体符文类型获取最大冷却时间
            float progress = Math.min(1.0f, (float) remainingTime / maxCooldownTicks);

            // 渲染原版风格的冷却效果
            renderVanillaStyleCooldown(guiGraphics, x, y, progress);
        }
    }

    // ==================== 辅助方法 ====================

    /**
     * 根据符文类型获取最大冷却时间
     * <p>
     * 从符文物品的NBT数据中获取符文类型，并查询对应的符文能力获取最大冷却时间。
     * 如果无法获取，则使用默认冷却时间。
     * </p>
     * 
     * @param stack 符文物品堆
     * @return 最大冷却时间（ticks）
     */
    private float getRuneMaxCooldown(ItemStack stack) {
        // 默认最大冷却时间为1200 ticks (60秒)
        float maxCooldown = 1200.0f;

        // 从NBT中获取符文类型
        if (stack.hasTag() && stack.getTag() != null && stack.getTag().contains(RuneItem.RUNE_TYPE)) {
            String runeType = stack.getTag().getString(RuneItem.RUNE_TYPE);

            // 从注册表中获取符文能力并获取其冷却时间
            if (RuneRegistry.hasRuneAbility(runeType)) {
                maxCooldown = RuneRegistry.getRuneAbility(runeType).getCooldown();
            }
        }

        // 确保最大冷却时间至少为1，避免除以零
        return Math.max(1.0f, maxCooldown);
    }

    /**
     * 渲染原版风格的冷却效果
     * <p>
     * 使用半透明的灰色矩形覆盖在物品图标上来表示冷却进度。
     * 覆盖层的高度根据冷却进度动态调整。
     * </p>
     * 
     * @param guiGraphics GUI图形渲染器
     * @param x 渲染位置X坐标
     * @param y 渲染位置Y坐标
     * @param progress 冷却进度 (0.0 - 1.0)
     */
    private void renderVanillaStyleCooldown(GuiGraphics guiGraphics, int x, int y, float progress) {
        if (progress < 1.0f) {
            int cooldownHeight = (int) (16 * (1.0f - progress));
            // 使用更高的Z轴层级确保冷却效果在物品图标之上
            guiGraphics.pose().pushPose();
            guiGraphics.pose().translate(0, 0, 200); // 增加Z轴偏移
            // 使用半透明的灰色渲染冷却效果
            guiGraphics.fill(x, y + cooldownHeight, x + 16, y + 16, 0x80FFFFFF);
            guiGraphics.pose().popPose();
        }
    }
}